package br.com.sis.rh.entity;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Transient;

import org.hibernate.search.annotations.DocumentId;
import org.hibernate.search.annotations.Indexed;
import org.hibernate.search.annotations.IndexedEmbedded;

@Entity
@Indexed
public class Candidato extends Entidade {

	/**
	 * Serial UID.
	 */
	private static final long serialVersionUID = 1L;
	
	@DocumentId
	@Override
	public Integer getId() {
		return super.getId();
	}

	@OneToOne
	@IndexedEmbedded
	private DadosPessoais dadosPessoais;
	
	@ManyToMany
	@JoinTable(name="Vaga_Candidato")
	private Set<Vaga> vaga = new HashSet<>();
	
	@OneToMany(orphanRemoval=true)
	private Set<GraduacaoProfissional> graduacaoProfissional = new HashSet<>();
	
	@OneToMany(orphanRemoval=true)
	private Set<PosGraduacaoProfissional> posGraduacaoProfissional = new HashSet<>();
	
	@OneToMany(orphanRemoval=true)
	private Set<CursoExtra> cursoExtra = new HashSet<>();
	
	@OneToOne
	private Remuneracao remuneracao;
	
	@OneToOne
	private PretensaoSalarial pretensaoSalarial;
	
	@OneToMany(orphanRemoval=true)
	private Set<CargoPretendido> cargoPretendido = new HashSet<>();
	
	@OneToMany
	private Set<Segmento> segmento = new HashSet<>();
	
	@IndexedEmbedded
	@OneToMany(orphanRemoval=false)
	private Set<Alocacao> alocacao = new HashSet<>();
	
	@OneToMany
	private Set<AreaAtuacao> areaAtuacao = new HashSet<>();
	
	@OneToMany
	private Set<Competencia> competencia = new HashSet<>();
	
	@OneToMany(orphanRemoval=true)
	private Set<IdiomaDominado> idiomaDominado = new HashSet<>();
	
	@ManyToOne
	@JoinTable(name="Usuario_Candidato", 
			joinColumns={@JoinColumn(name="candidato_id", referencedColumnName="id")
		},	
			inverseJoinColumns={@JoinColumn(name="usuario_id", referencedColumnName="id")}
	)
	private Usuario usuario;
	
	@OneToOne
	private Avaliacao avaliacao;
	
	private String observacao;
	private String status;
	private String nivel;
	private String importacaoArquivo;
	
	private Date dataAtualizacao;
	
	@Transient
	private Double porcentagemPreenchidaDadosGerais;
	
	@Transient
	private Double porcentagemPreenchidaFormacoes;
	
	@Transient
	private Double porcentagemPreenchidaHistorico;
	
	@Transient
	private Double porcentagemPreenchidaExpectativa;
	
	@Transient
	private Double porcentagemPreenchidaAvaliacao;

	public String getObservacao() {
		return observacao;
	}

	public void setObservacao(String observacao) {
		this.observacao = observacao;
	}

	public String getImportacaoArquivo() {
		return importacaoArquivo;
	}

	public void setImportacaoArquivo(String importacaoArquivo) {
		this.importacaoArquivo = importacaoArquivo;
	}

	public String getStatus() {
		return status;
	}

	public void setStatus(String status) {
		this.status = status;
	}

	public String getNivel() {
		return nivel;
	}

	public void setNivel(String nivel) {
		this.nivel = nivel;
	}

	public Set<Vaga> getVaga() {
		return vaga;
	}

	public void setVaga(Set<Vaga> vaga) {
		this.vaga = vaga;
	}

	public Set<Segmento> getSegmento() {
		return segmento;
	}

	public void setSegmento(Set<Segmento> segmento) {
		this.segmento = segmento;
	}

	public Set<Alocacao> getAlocacao() {
		return alocacao;
	}

	public void setAlocacao(Set<Alocacao> alocacao) {
		this.alocacao = alocacao;
	}

	public Set<AreaAtuacao> getAreaAtuacao() {
		return areaAtuacao;
	}

	public void setAreaAtuacao(Set<AreaAtuacao> areaAtuacao) {
		this.areaAtuacao = areaAtuacao;
	}

	public Set<Competencia> getCompetencia() {
		return competencia;
	}

	public void setCompetencia(Set<Competencia> competencia) {
		this.competencia = competencia;
	}

	public DadosPessoais getDadosPessoais() {
		return dadosPessoais;
	}

	public void setDadosPessoais(DadosPessoais dadosPessoais) {
		this.dadosPessoais = dadosPessoais;
	}

	public Remuneracao getRemuneracao() {
		return remuneracao;
	}

	public void setRemuneracao(Remuneracao remuneracao) {
		this.remuneracao = remuneracao;
	}

	public Set<CursoExtra> getCursoExtra() {
		return cursoExtra;
	}

	public void setCursoExtra(Set<CursoExtra> cursoExtra) {
		this.cursoExtra = cursoExtra;
	}

	public Set<GraduacaoProfissional> getGraduacaoProfissional() {
		return graduacaoProfissional;
	}

	public void setGraduacaoProfissional(
			Set<GraduacaoProfissional> graduacaoProfissional) {
		this.graduacaoProfissional = graduacaoProfissional;
	}

	public Set<PosGraduacaoProfissional> getPosGraduacaoProfissional() {
		return posGraduacaoProfissional;
	}

	public void setPosGraduacaoProfissional(
			Set<PosGraduacaoProfissional> posGraduacaoProfissional) {
		this.posGraduacaoProfissional = posGraduacaoProfissional;
	}
	
	public Set<CargoPretendido> getCargoPretendido() {
		return cargoPretendido;
	}

	public void setCargoPretendido(Set<CargoPretendido> cargoPretendido) {
		this.cargoPretendido = cargoPretendido;
	}
	
	public Set<IdiomaDominado> getIdiomaDominado() {
		return idiomaDominado;
	}

	public void setIdiomaDominado(Set<IdiomaDominado> idiomaDominado) {
		this.idiomaDominado = idiomaDominado;
	}

	public PretensaoSalarial getPretensaoSalarial() {
		return pretensaoSalarial;
	}

	public void setPretensaoSalarial(PretensaoSalarial pretensaoSalarial) {
		this.pretensaoSalarial = pretensaoSalarial;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Date getDataAtualizacao() {
		return dataAtualizacao;
	}

	public void setDataAtualizacao(Date dataAtualizacao) {
		this.dataAtualizacao = dataAtualizacao;
	}

	public Double getPorcentagemPreenchidaDadosGerais() {
		return porcentagemPreenchidaDadosGerais;
	}

	public void setPorcentagemPreenchidaDadosGerais(
			Double porcentagemPreenchidaDadosGerais) {
		this.porcentagemPreenchidaDadosGerais = porcentagemPreenchidaDadosGerais;
	}

	public Double getPorcentagemPreenchidaFormacoes() {
		return porcentagemPreenchidaFormacoes;
	}

	public void setPorcentagemPreenchidaFormacoes(
			Double porcentagemPreenchidaFormacoes) {
		this.porcentagemPreenchidaFormacoes = porcentagemPreenchidaFormacoes;
	}

	public Double getPorcentagemPreenchidaHistorico() {
		return porcentagemPreenchidaHistorico;
	}

	public void setPorcentagemPreenchidaHistorico(
			Double porcentagemPreenchidaHistorico) {
		this.porcentagemPreenchidaHistorico = porcentagemPreenchidaHistorico;
	}

	public Double getPorcentagemPreenchidaExpectativa() {
		return porcentagemPreenchidaExpectativa;
	}

	public void setPorcentagemPreenchidaExpectativa(
			Double porcentagemPreenchidaExpectativa) {
		this.porcentagemPreenchidaExpectativa = porcentagemPreenchidaExpectativa;
	}

	public Double getPorcentagemPreenchidaAvaliacao() {
		return porcentagemPreenchidaAvaliacao;
	}

	public void setPorcentagemPreenchidaAvaliacao(
			Double porcentagemPreenchidaAvaliacao) {
		this.porcentagemPreenchidaAvaliacao = porcentagemPreenchidaAvaliacao;
	}

	public Avaliacao getAvaliacao() {
		return avaliacao;
	}

	public void setAvaliacao(Avaliacao avaliacao) {
		this.avaliacao = avaliacao;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (!(obj instanceof Candidato))
			return false;
		Candidato other = (Candidato) obj;
		if (getId() == null) {
			if (other.getId() != null)
				return false;
		} else if (!getId().equals(other.getId()))
			return false;
		return true;
	}
	
}
